package main

import (
	"fmt"
	"reflect"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	p := Person{Name: "John", Age: 30}
	v := reflect.ValueOf(p) // 获取p的反射对象，此时v的类型是reflect.Struct，值为p的副本（非地址）
	// 如果p是指针类型，例如*Person，则需要使用v := reflect.ValueOf(&p).Elem()来获取指针指向的值的反射对象。
	for i := 0; i < v.NumField(); i++ { // 遍历所有字段
		field := v.Field(i)                                                             // 获取第i个字段的反射值对象
		fmt.Printf("Field %d: %s = %v\n", i, v.Type().Field(i).Name, field.Interface()) // 打印字段名和值
	}
}
